package com.boil.qz.safekavass.weixin.controller;

import com.alibaba.fastjson.JSONObject;
import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.weixin.service.WebpageAuthorizeService;
import com.boil.qz.safekavass.weixin.util.WeixinUtils;
import com.boil.util.BaseController;
import com.boil.util.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Created by ChenYong on 2017-05-17.
 * <br>
 * 微信网页授权 Controller。
 */
@Controller
@RequestMapping("/weixin/webpage/authorize")
public class WebpageAuthorizeController extends BaseController {
    /**
     * 注入网页授权业务处理 Service
     */
    @Autowired
    private WebpageAuthorizeService webpageAuthorizeService;

    /**
     * snsapi_base 网页授权，主要用于获取 openid。
     *
     * @param model 模型
     * @param code  微信传过来的 code
     * @param state 重定向后会带上 state 参数，开发者可以填写 a-zA-Z0-9 的参数值，最多128字节
     * @return
     */
    @RequestMapping(method = RequestMethod.GET, value = "/snsapi_base.html")
    public String authorizeSnsapiBase(Model model, String code, String state) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        model.addAttribute(Constants.RESULT_VO, resultVo);

        try {
            log.info("微信snsapi_base网页授权--->获取code：{}，state：{}", code, state);

            if (StringUtils.isNotBlank(code)) {
                // 通过 code 换取网页授权 access_token，也获取到了 openid
                JSONObject result = WeixinUtils.sendHttpsGet(String.format(WeixinUtils.URL_SNS_OAUTH2_ACCESS_TOKEN, WeixinUtils.APP_ID, WeixinUtils.APP_SECRET, code));
                // 错误代码
                String errcode = result.getString(WeixinUtils.ERRCODE_STR);

                // 获取成功
                if (StringUtils.isBlank(errcode)) {
                    // 获取 openid
                    String openid = result.getString(WeixinUtils.OPENID_STR);

                    // 根据 state 进行业务操作
                    if (StringUtils.isNotBlank(state)) {
                        String redirectUrl = webpageAuthorizeService.doAuthorizeSnsapiBase(resultVo, openid, state);

                        if (StringUtils.isNotBlank(redirectUrl)) {
                            return redirectUrl;
                        }
                    }

                    resultVo.setResultCode(Constants.ERROR_404);
                    resultVo.setResultMsg(Constants.ERROR_404_MSG);

                    // 获取失败
                } else {
                    // 错误描述
                    String errmsg = result.getString(WeixinUtils.ERRMSG_STR);

                    resultVo.setResultCode(Integer.valueOf(errcode));
                    resultVo.setResultMsg(errmsg);
                }
            } else {
                resultVo.setResultCode(Constants.ERROR_404);
                resultVo.setResultMsg(Constants.ERROR_404_MSG);
            }
        } catch (Exception e) {
            log.error("微信snsapi_base网页授权出现异常：{}", e);

            resultVo.setResultCode(Constants.SYS_ERROR);
            resultVo.setResultMsg(e.getMessage());
        }

        resultVo.setResult(null);

        return "/weixin/result";
    }

    /**
     * snsapi_userinfo 网页授权，主要用于获取用户信息。
     *
     * @param model 模型
     * @param code  微信传过来的 code
     * @param state 重定向后会带上 state 参数，开发者可以填写 a-zA-Z0-9 的参数值，最多128字节
     * @return
     */
    @RequestMapping(method = RequestMethod.GET, value = "/snsapi_userinfo.html")
    public String authorizeSnsapiUserinfo(Model model, String code, String state) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        model.addAttribute(Constants.RESULT_VO, resultVo);

        try {
            log.info("微信snsapi_userinfo网页授权--->获取code：{}，state：{}", code, state);

            if (StringUtils.isNotBlank(code)) {
                // 通过 code 换取网页授权 access_token，也获取到了 openid
                JSONObject result = WeixinUtils.sendHttpsGet(String.format(WeixinUtils.URL_SNS_OAUTH2_ACCESS_TOKEN, WeixinUtils.APP_ID, WeixinUtils.APP_SECRET, code));
                // 错误代码
                String errcode1 = result.getString(WeixinUtils.ERRCODE_STR);

                // 获取成功
                if (StringUtils.isBlank(errcode1)) {
                    // 获取 access_token
                    String accessToken = result.getString(WeixinUtils.ACCESS_TOKEN_STR);
                    // 获取 openid
                    String openid = result.getString(WeixinUtils.OPENID_STR);
                    // 拉取用户信息（需 scope 为 snsapi_userinfo）
                    JSONObject weixinUserJSONObject = WeixinUtils.sendHttpsGet(String.format(WeixinUtils.URL_SNS_USERINFO, accessToken, openid));
                    // 错误代码
                    String errcode2 = weixinUserJSONObject.getString(WeixinUtils.ERRCODE_STR);

                    // 获取成功
                    if (StringUtils.isBlank(errcode2)) {
                        // 根据 state 进行业务操作
                        if (StringUtils.isNotBlank(state)) {
                            String redirectUrl = webpageAuthorizeService.doAuthorizeSnsapiUserinfo(resultVo, weixinUserJSONObject, state);

                            if (StringUtils.isNotBlank(redirectUrl)) {
                                return redirectUrl;
                            }
                        }

                        resultVo.setResultCode(Constants.ERROR_404);
                        resultVo.setResultMsg(Constants.ERROR_404_MSG);

                        // 获取失败
                    } else {
                        // 错误描述
                        String errmsg = weixinUserJSONObject.getString(WeixinUtils.ERRMSG_STR);

                        resultVo.setResultCode(Integer.valueOf(errcode2));
                        resultVo.setResultMsg(errmsg);
                    }

                    // 获取失败
                } else {
                    // 错误描述
                    String errmsg = result.getString(WeixinUtils.ERRMSG_STR);

                    resultVo.setResultCode(Integer.valueOf(errcode1));
                    resultVo.setResultMsg(errmsg);
                }
            } else {
                resultVo.setResultCode(Constants.ERROR_404);
                resultVo.setResultMsg(Constants.ERROR_404_MSG);
            }
        } catch (Exception e) {
            log.error("微信snsapi_userinfo 网页授权出现异常：{}", e);

            resultVo.setResultCode(Constants.SYS_ERROR);
            resultVo.setResultMsg(e.getMessage());
        }

        resultVo.setResult(null);

        return "/weixin/result";
    }
}